A := $(C)	# 即时变量，此时C未定义，A为空
B = $(C)	# 延时变量，用到B时再确定具体的值
C = abc
C ?= 123	# C不是第一次定义，被忽略
C += 789
D ?= xyz	# D是第一次定义

DIR := $(shell pwd)

var:
	@echo A = $(A)
	@echo B = $(B)
	@echo C = $(C)
	@echo D = $(D)
	@echo DIR = $(DIR)

# ---------------------------------------

A = a b c
B = $(foreach v, $(A), $(v).c)	# 取出$(A)中的每一项存到v中，执行$(v).c，最后以空格分隔返回
C = $(B)
C += d.o
D = $(filter %.c, $(C))			# 返回$(C)中所有符合%.c的项
E = $(filter-out %.c, $(C))		# 返回$(C)中所有不符合%.c的项
files := $(wildcard *.c)		# 获取当前目录下所有的.c文件
files_obj := $(patsubst %.c, %.o, $(files))	# 将$(files)中所有符合%.c的项替换为%.o
files_obj2 := $(files:%.c=%.o)	# 效果和patsubat相同


func:
	@echo A = $(A)
	@echo B = $(B)
	@echo C = $(C)
	@echo D = $(D)
	@echo E = $(E)
	@echo files = $(files)
	@echo files_obj = $(files_obj)
	@echo files_obj2 = $(files_obj2)